return {
  -- npm install -g tree-sitter-cli
  lazy = false,
  priority = 2000,
  'nvim-treesitter/nvim-treesitter',
  build = ":TSUpdate",
  dependencies = {
    -- "JoosepAlviste/nvim-ts-context-commentstring",

    -- -- 类似插件 gcmt/wildfire.vim 的功能, 这个功能更加强大
    -- 'nvim-treesitter/nvim-treesitter-textobjects',
    -- -- 漂亮的成对括号
    -- 'HiPhish/nvim-ts-rainbow2',
    -- -- 自动完成标签
    -- 'windwp/nvim-ts-autotag',
  },
  config = function()
    -- require('nvim-ts-autotag').setup({
    --   filetypes = {
    --     'javascript',
    --     'typescript',
    --     'javascriptreact',
    --     'typescriptreact',
    --     'svelte',
    --     'vue',
    --     'tsx',
    --     'jsx',
    --     'rescript',
    --     'html',
    --     'xml',
    --     'php',
    --     'markdown',
    --     'handlebars',
    --     'hbs',
    --     'rust',
    --     "rs",
    --     "python",
    --     "py"
    --   },
    -- })
    -- vim.wo.foldmethod = 'expr'
    -- vim.wo.foldexpr = 'nvim_treesitter#foldexpr()'
    require('nvim-treesitter.configs').setup({
      ensure_installed = {
        "json",
        "javascript",
        "typescript",
        "tsx",
        "yaml",
        "html",
        "css",
        "markdown",
        "markdown_inline",
        "python",
        "graphql",
        "bash",
        "lua",
        "vim",
        "dockerfile",
        "gitignore",
        "regex",
        "c",
        "go",
        "vimdoc",
        "cmake",
        "cpp",
        "comment",
        "diff",
        "git_config",
        "git_rebase",
        "gitattributes",
        "gitcommit",
        "gomod",
        "gosum",
        "gowork",
        "hjson",
        "ini",
        "javascript",
        "json5",
        "jsdoc",
        "jsonc",
        "luadoc",
        "luap",
        "make",
        "meson",
        "ninja",
        "nix",
        "scss",
        "sql",
        "toml",
        "rust",
        "vue",
        "zig",
      },
      sync_install = false, -- 不同步安装
      auto_install = true,
      ignore_install = { "javascript" },
      highlight = {
        enable = true,
        additional_vim_regex_highlighting = false,
      },
      indent = {
        enable = true,
      },
      -- 区域选择
      incremental_selection = {
        enable = true,
        keymaps = {
          init_selection = "<CR>",       -- "gnn",
          node_incremental = "<CR>",     -- "grn",
          scope_incremental = "<SPACE>", -- "grc",
          node_decremental = "<TAB>",    -- "grm",
        },
      },
      -- 依赖插件 "JoosepAlviste/nvim-ts-context-commentstring"
      -- context_commentstring = {
      --   enable = true,
      -- },
      -- 依赖插件 'windwp/nvim-ts-autotag' 也可以直接不配置直接  require('nvim-ts-autotag').setup()
      -- autotag = {
      --   enable = true,
      --   -- filetypes = { "html" , "xml" }, -- 可以在这配置 filetypes ，也可以在 nvim-ts-autotag 中配置 require('nvim-ts-autotag').setup
      -- },
      -- -- 依赖插件 'HiPhish/nvim-ts-rainbow2'
      -- rainbow = {
      --   enable = true,
      --   -- disable = { 'jsx', 'cpp' },
      --   -- disable = true,
      --   query = 'rainbow-parens',
      --   strategy = require('ts-rainbow').strategy.global,
      -- },
      -- -- 依赖插件 'nvim-treesitter/nvim-treesitter-textobjects'
      -- textobjects = {
      --   select = {
      --     enable = true,

      --     -- Automatically jump forward to textobj, similar to targets.vim
      --     lookahead = true,

      --     -- vif dif  f 函数
      --     -- diw viw  w 单词
      --     -- di" vi"  " 一些符号,例如, { ' " [
      --     keymaps = {
      --       -- You can use the capture groups defined in textobjects.scm
      --       ["af"] = "@function.outer",
      --       ["if"] = "@function.inner",
      --       ["ac"] = "@class.outer",
      --       -- You can optionally set descriptions to the mappings (used in the desc parameter of
      --       -- nvim_buf_set_keymap) which plugins like which-key display
      --       ["ic"] = { query = "@class.inner", desc = "Select inner part of a class region" },
      --       -- You can also use captures from other query groups like `locals.scm`
      --       ["as"] = { query = "@scope", query_group = "locals", desc = "Select language scope" },
      --     },
      --     -- You can choose the select mode (default is charwise 'v')
      --     --
      --     -- Can also be a function which gets passed a table with the keys
      --     -- * query_string: eg '@function.inner'
      --     -- * method: eg 'v' or 'o'
      --     -- and should return the mode ('v', 'V', or '<c-v>') or a table
      --     -- mapping query_strings to modes.
      --     selection_modes = {
      --       ['@parameter.outer'] = 'v', -- charwise
      --       ['@function.outer'] = 'V',  -- linewise
      --       ['@class.outer'] = '<c-v>', -- blockwise
      --     },
      --     include_surrounding_whitespace = false
      --   },
      --   swap = {
      --     -- 调换参数
      --     enable = true,
      --     swap_next = {
      --       ["<leader>a"] = "@parameter.inner",
      --     },
      --     swap_previous = {
      --       ["<leader>A"] = "@parameter.inner",
      --     },
      --   },
      -- }
    })
  end
}
